package com.ia2014.tp.portal2.facades;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.ejb.StatefulTimeout;
import javax.enterprise.context.SessionScoped;

import com.ia2014.tp.portal2.ejb.AdministradorCarritos;
import com.ia2014.tp.portal2.ejb.AdministradorArticulos; 
import com.ia2014.tp.portal2.ejb.AdministradorConfig;
import com.ia2014.tp.portal2.entities.Usuario;
import com.ia2014.tp.portal2.log.LogsLogisticaMonitoreo;
import com.ia2014.tp.portal2.vo.ItemVentaVO;
import com.ia2014.tp.portal2.vo.ArticuloVO;
import com.ia2014.tp.portal2.vo.UsuarioVO;

/**
 * Session Bean implementation class FacadeVentaBean
 */
@Stateful
@SessionScoped
@StatefulTimeout(value=2, unit=TimeUnit.HOURS)
public class FacadeVentaBean implements FacadeVenta {
	private Map<Integer, ItemVentaVO> itemsVo;
	
	@EJB
	private AdministradorCarritos administradorCarritos;
	
	@EJB 
	private AdministradorArticulos administradorArticulos;
	
	@EJB
	private AdministradorConfig administradorConfig;
	
	private UsuarioVO usuarioVo = null;
	
	@Override
	public boolean login(UsuarioVO usuarioVO){
		
		this.usuarioVo = usuarioVO;
		
		return administradorCarritos.login(usuarioVO);
		
	}
	
	public FacadeVentaBean(){
		super();
		this.itemsVo = new Hashtable<Integer, ItemVentaVO>();
		
	}
	
	@Override
	public void agregarItem(ItemVentaVO item){
		
		//Actualiza los parametros de configuracion
		administradorConfig.actualizarConfiguracion();
		
		LogsLogisticaMonitoreo.logMessage("El usuario - " + this.getUsuarioVo().getUserLogin() + " - del Portal Web 2 ha agregado el articulo - " + item.getArticulo().getNombre() + " - a su Carrito");
	}
	
	@Override
	public ItemVentaVO buscarItem(Integer idArticulo){
		return this.itemsVo.get(idArticulo);		
	}
	
	@Override
	public void actualizarCantidadItem(Integer idArticulo, Integer cant){
		//Actualiza los parametros de configuracion
		administradorConfig.actualizarConfiguracion();
				
		ItemVentaVO item = this.itemsVo.get(idArticulo);
		if (item != null){
			item.setCantidad(cant);
		}
		
		LogsLogisticaMonitoreo.logMessage("El usuario - " + this.getUsuarioVo().getUserLogin() + " - del Portal Web 2 ha actualizado la cantidad del articulo - " + item.getArticulo().getNombre() + " - de su Carrito");
	}
	
	@Override
	public List<ItemVentaVO> getListaItems(){
		List<ItemVentaVO> lista = new ArrayList<ItemVentaVO>();
		if (this.itemsVo.values() != null){
			lista =  new ArrayList<ItemVentaVO>(this.itemsVo.values());
		}
		return lista;
	}
	
	@Override
	public void eliminarItem(Integer idProducto){
		//Actualiza los parametros de configuracion
		administradorConfig.actualizarConfiguracion();
				
		ItemVentaVO item = this.itemsVo.get(idProducto);
		this.itemsVo.remove(idProducto);
		
		LogsLogisticaMonitoreo.logMessage("El usuario - " + this.getUsuarioVo().getUserLogin() + " - del Portal Web 2 ha eliminado el articulo - " + item.getArticulo().getNombre() + " - de su Carrito");
	}
	
	@Override
	public void confirmarVenta(){
		Usuario usuario = new Usuario();
		usuario.setVO(this.usuarioVo);
		administradorCarritos.setUsuario(usuario);
		administradorCarritos.setItems(new ArrayList<ItemVentaVO>(this.getItemsVo().values()));
		administradorCarritos.confirmarVenta();
		
	}
	
	@Override
	public List<ArticuloVO> getListaArticulos(){
		
		return administradorArticulos.getListaArticulos();
	}

	public UsuarioVO getUsuarioVo() {
		return usuarioVo;
	}

	@Override
	public void setUsuarioVo(UsuarioVO usuarioVo) {
		this.usuarioVo = usuarioVo;
	}

	public Map<Integer, ItemVentaVO> getItemsVo() {
		return itemsVo;
	}

	public void setItemsVo(Map<Integer, ItemVentaVO> itemsVo) {
		this.itemsVo = itemsVo;
	}
}
